import { fetchSysFiledData } from './systemMapFiledData'

/*
 * 全部字段配置
 * @filedData: Array 字段数据
 * @itemGroupName: string 分组名称
 * @salaryItems: Array   分组数据
 * @itemName: string  字段名称
 * @value: string  字段值
 * @filedType: string 字段类型 system: 系统项  import: 导入项   calculate 计算项
 * @formula: string  方案计算公式
 * @checked: Boolean 是否选中
 * @appName: string 来源应用名称
 * @value: string  来源字段值
 * @sysFlag: Boolean 是否系统字段 是否可以删除
 * @valueType string int
 * @dataMessage string 数据来源
 * @dataField string 数据来源字段
 * @dataGroup string 数据来源分组
 * @dataGroupName string 数据来源分组名称
 * @valueType string int int
 */

// 封装一个函数 传入 filedType valueType value 生成选项列表
const generateFiledList = ({ itemGroupName, filedType, salaryItems }) => {
  return {
    itemGroupName,
    salaryItems: salaryItems.map(value => ({
      itemName: value.itemName,
      filedType,
      valueType: value.valueType,
      value: value.itemName,
      dataMessage: value.dataMessage || null,
      formulaHtml: value.formulaHtml || null
    }))
  }
}

// 常用导入项
const commonlyImports = [
  {
    itemName: '应发工资',
    valueType: 'int'
  },
  {
    itemName: '合并扣税',
    valueType: 'int'
  },
  {
    itemName: '扣企业年金',
    valueType: 'int'
  },
  {
    itemName: '工会会费',
    valueType: 'int'
  },
  {
    itemName: '发工资人数',
    valueType: 'int'
  },
  {
    itemName: '用工项目',
    valueType: 'string'
  },
  {
    itemName: '人员性质',
    valueType: 'string'
  },
  {
    itemName: '日历天数',
    valueType: 'int'
  },
  {
    itemName: '应出勤天数',
    valueType: 'int'
  },
  {
    itemName: '实际出勤天数',
    valueType: 'int'
  },
  {
    itemName: '缺勤天数',
    valueType: 'int'
  },
  {
    itemName: '病假天数',
    valueType: 'int'
  },
  {
    itemName: '夜班天数',
    valueType: 'int'
  },
  {
    itemName: '周末加班（天或H）',
    valueType: 'int'
  },
  {
    itemName: '加点时数',
    valueType: 'int'
  },
  {
    itemName: '节假日加班（天或H）',
    valueType: 'int'
  },
  {
    itemName: '绩效系数',
    valueType: 'int'
  },
  {
    itemName: '工龄系数',
    valueType: 'int'
  },
  {
    itemName: '基本/协议工资标准',
    valueType: 'int'
  },
  {
    itemName: '岗位工资标准',
    valueType: 'int'
  },
  {
    itemName: '绩效/浮动工资基数',
    valueType: 'int'
  },
  {
    itemName: '安全绩效奖',
    valueType: 'int'
  },
  {
    itemName: '党级',
    valueType: 'string'
  },
  {
    itemName: '基本工资',
    valueType: 'int'
  },
  {
    itemName: '岗位工资/任务工资',
    valueType: 'string'
  },
  {
    itemName: '月度绩效',
    valueType: 'int'
  },
  {
    itemName: '考核系数',
    valueType: 'int'
  },
  {
    itemName: '安全绩效/其他奖金',
    valueType: 'int'
  },
  {
    itemName: '月度奖金',
    valueType: 'int'
  },
  {
    itemName: '季度奖金',
    valueType: 'int'
  },
  {
    itemName: '其他奖金',
    valueType: 'int'
  },
  {
    itemName: '加班工资',
    valueType: 'int'
  },
  {
    itemName: '加点工资',
    valueType: 'int'
  },
  {
    itemName: '节假日值班',
    valueType: 'int'
  },
  {
    itemName: '计件工资',
    valueType: 'int'
  },
  {
    itemName: '全勤奖金',
    valueType: 'int'
  },
  {
    itemName: '探亲路费',
    valueType: 'int'
  },
  {
    itemName: '公务出行费',
    valueType: 'int'
  },
  {
    itemName: '艰苦地区补贴',
    valueType: 'int'
  },
  {
    itemName: '工龄津贴',
    valueType: 'int'
  },
  {
    itemName: '岗位津贴',
    valueType: 'int'
  },
  {
    itemName: '班组长津贴',
    valueType: 'int'
  },
  {
    itemName: '师傅津贴',
    valueType: 'int'
  },
  {
    itemName: '外勤津贴',
    valueType: 'int'
  },
  {
    itemName: '交通补贴',
    valueType: 'int'
  },
  {
    itemName: '餐补',
    valueType: 'int'
  },
  {
    itemName: '租房补贴',
    valueType: 'int'
  },
  {
    itemName: '体检补贴',
    valueType: 'int'
  },
  {
    itemName: '学历补贴',
    valueType: 'int'
  },
  {
    itemName: '证书补贴',
    valueType: 'int'
  },
  {
    itemName: '夜班补贴',
    valueType: 'int'
  },
  {
    itemName: '高温补贴',
    valueType: 'int'
  },
  {
    itemName: '其他奖金',
    valueType: 'int'
  },
  {
    itemName: '其他',
    valueType: 'int'
  },
  {
    itemName: '社保单位补贴',
    valueType: 'int'
  },
  {
    itemName: '公积金单位补贴',
    valueType: 'int'
  },
  {
    itemName: '多休或少休补、扣款',
    valueType: 'int'
  },
  {
    itemName: '工资补款',
    valueType: 'int'
  },
  {
    itemName: '其他扣款',
    valueType: 'int'
  },
  {
    itemName: '扣款1',
    valueType: 'int'
  },
  {
    itemName: '扣款2',
    valueType: 'int'
  },
  //累计子女教育支出扣除
  {
    itemName: '累计子女教育支出扣除',
    valueType: 'int'
  },
  //累计继续教育支出扣除
  {
    itemName: '累计继续教育支出扣除',
    valueType: 'int'
  },
  //累计住房贷款利息支出扣除
  {
    itemName: '累计住房贷款利息支出扣除',
    valueType: 'int'
  },
  //累积住房租金支出扣除
  {
    itemName: '累积住房租金支出扣除',
    valueType: 'int'
  },
  //累计赡养老人支出扣除
  {
    itemName: '累计赡养老人支出扣除',
    valueType: 'int'
  },
  //累计婴幼儿照护费用
  {
    itemName: '累计婴幼儿照护费用',
    valueType: 'int'
  },
  {
    itemName: '备注',
    valueType: 'string'
  },
  // 累计免税额
  {
    itemName: '累计免税额',
    valueType: 'int',
  }
]

const commonlyUsedImports = generateFiledList({ itemGroupName: '常用导入项', filedType: 'import', salaryItems: commonlyImports })

// 常用计算项
const commonPayrollCalculations = [
  {
    itemName: '本月应税',
    valueType: 'int',
    dataMessage: '#应发工资# + #合并扣税# - #社保保险扣缴合计#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#应发工资#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#合并扣税#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#社保保险扣缴合计#</span>`
  },
  // 专项累计=累计子女教育支出扣除+累计继续教育支出扣除+累计住房贷款利息支出扣除+累积住房租金支出扣除+累计赡养老人支出扣除+累计婴幼儿照护费用
  {
    itemName: '专项累计',
    valueType: 'int',
    dataMessage: '#累计子女教育支出扣除# + #累计继续教育支出扣除# + #累计住房贷款利息支出扣除# + #累积住房租金支出扣除# + #累计赡养老人支出扣除# + #累计婴幼儿照护费用#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#累计子女教育支出扣除#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累计继续教育支出扣除#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累计住房贷款利息支出扣除#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累积住房租金支出扣除#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累计赡养老人支出扣除#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累计婴幼儿照护费用#</span> `
  },
  //累计应税含本月=等于本月应税+累积应税不含本月
  {
    itemName: '累计应税含本月',
    valueType: 'int',
    dataMessage: '#本月应税# + #累积应税不含本月#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#本月应税#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#累积应税不含本月#</span>`
  },
  //累计扣税含本月=累计扣税不含本月+本月预扣缴个税
  {
    itemName: '累计扣税含本月',
    valueType: 'int',
    dataMessage: '#累计扣税不含本月# + #本月预扣缴个税#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#累计扣税不含本月#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#本月预扣缴个税#</span>`
  },
  //本月预扣缴个税=（累计应税含本月-累计免税额-专项累计）*速算扣除公式计算-累计扣税不含本月
  {
    itemName: '本月预扣缴个税',
    valueType: 'int',
    dataMessage: '(#累计应税含本月# - #累计免税额# - #专项累计#) * #速算扣除公式计算# - #累计扣税不含本月#',
    formulaHtml: `(<span class="filed-span" style="color: rgb(89, 117, 251);">#累计应税含本月#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#累计免税额#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#专项累计#</span>) * <span class="filed-span" style="color: rgb(89, 117, 251);">#速算扣除公式计算#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#累计扣税不含本月#</span>`
  },
  //个人小计=个人社保和公积金合计+本月预扣缴个税+实发工资+服务费+公司社保合计+公司公积金合计+预收社保（单位+个人）+预收公积金（单位+个人）
  {
    itemName: '个人小计',
    valueType: 'int',
    dataMessage: '#个人社保和公积金合计# + #本月预扣缴个税# + #实发工资# + #服务费# + #公司社保合计# + #公司公积金合计# + #预收社保（单位+个人）# + #预收公积金（单位+个人）#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#个人社保和公积金合计#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#本月预扣缴个税#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#实发工资#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#服务费#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#公司社保合计#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#公司公积金合计#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#预收社保（单位+个人）#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#预收公积金（单位+个人）#</span>`
  },
  //实发工资=应发工资-个人社保和公积金合计-本月预扣缴个税-扣款1-扣款2
  {
    itemName: '实发工资',
    valueType: 'int',
    dataMessage: '#应发工资# - #个人社保和公积金合计# - #本月预扣缴个税# - #扣款1# - #扣款2#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#应发工资#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#个人社保和公积金合计#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#本月预扣缴个税#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#扣款1#</span> - <span class="filed-span" style="color: rgb(89, 117, 251);">#扣款2#</span>`
  },
  // 收税金=个人小计*0.0672
  {
    itemName: '收税金',
    valueType: 'int',
    dataMessage: '#个人小计# * 0.0672',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#个人小计#</span> * 0.0672`
  },
  //开票合计=个人小计+收税金
  {
    itemName: '开票合计',
    valueType: 'int',
    dataMessage: '#个人小计# + #收税金#',
    formulaHtml: `<span class="filed-span" style="color: rgb(89, 117, 251);">#个人小计#</span> + <span class="filed-span" style="color: rgb(89, 117, 251);">#收税金#</span>`
  },
  // 本月个税 = TAX( #累计应税工资（含本月）# , #累计免税额# , #专项累计# , #累计扣税不含本月# )
  {
    itemName: '本月个税',
    valueType: 'int',
    dataMessage: 'TAX( #累计应税工资含本月# , #累计免税额# , #专项累计# , #累计扣税不含本月# )',
    formulaHtml: `TAX( <span class="filed-span" style="color: rgb(89, 117, 251);">#累计应税工资含本月#</span> , <span class="filed-span" style="color: rgb(89, 117, 251);">#累计免税额#</span> , <span class="filed-span" style="color: rgb(89, 117, 251);">#专项累计#</span> , <span class="filed-span" style="color: rgb(89, 117, 251);">#累计扣税不含本月#</span> )`
  }
]

const commonPayrollCalculationsImports = generateFiledList({ itemGroupName: '常用计算项', filedType: 'calculate', salaryItems: commonPayrollCalculations })

// 最终合并的导入项 计算项等其他数据
let result = [commonPayrollCalculationsImports, commonlyUsedImports]

/**
 *  从数据库中获取系统映射字段数据
 *  @return {Array} 系统映射字段数据
 *  @filedData: Array 字段数据
 *  @filedDataFlap: Array 字段数据扁平化
 */

const fetchAndProcessFiledData = async () => {
  return await new Promise(async (resolve, reject) => {
    try {
      // const { sysMapFiledDataMap } = await fetchSysFiledData()
      // const filedData = sysMapFiledDataMap.concat(result)
        const filedData = result

      // filedData 扁平 salaryItems 为一维数组
      const filedDataFlap = filedData.reduce((prev, next) => {
        return prev.concat(next.salaryItems)
      }, [])

      const filedDataFlapMap = filedDataFlap.reduce((prev, next) => {
        prev[next.itemName] = next
        return prev
      }, {})

      resolve({ filedData, filedDataFlap, filedDataFlapMap })
    } catch (error) {
      reject(error)
    }
  })
}
/**
 *  从数据库中获取系统映射字段数据
 *  @return {{filedData, filedDataFlap,filedDataFlapMap}} 系统映射字段数据
 *  @filedData: Array 字段数据
 *  @filedDataFlap: Array 字段数据扁平化
 *  @filedDataFlapMap: Object 字段数据扁平化Map
 */
export const initializeFiledData = async () => {
  return await new Promise(async (resolve, reject) => {
    try {
      const { filedData, filedDataFlap, filedDataFlapMap } = await fetchAndProcessFiledData()
      resolve({ filedData, filedDataFlap, filedDataFlapMap })
    } catch (error) {
      reject(error)
    }
  })
}
